package com.johnny.kotlinstudy.study1

/**
 *
 *  Created by Johnny on 2023/3/8
 *  Copyright © 2023年 . All rights reserved.
 *
 *  Describe: 函数
 */
fun main(args: Array<String>) {


    //第一种写法
    val timeStr = { year: Int, name: String, hour: Int ->
        "${year}年，${name}跑马拉松坚持了$hour 小时"
    }
    showOnEvent("Johnny", timeStr)


    //第二种写法
    //简写 如果 一个函数的lambda参数排在最后，或者是唯一参数，那么括住lambda值参的一对圆括号就可以省略
    showOnEvent("Johnny") { year: Int, name: String, hour: Int ->
        "${year}年，${name}跑马拉松坚持了$hour 小时"
    }

    //todo 内联函数

    println(inlineCaleValue(1, 2, 3))
    println(inlineCaleValue(100, 200, 300))

    //todo 函数引用
    showOnEvent("Johnny", ::getEventStr)

    //todo 函数类型作为返回值
    val getEventStr: (String) -> String = testName()
    println(getEventStr("函数类型作为返回值"))


}

/**
 * 事件方法
 */
fun showOnEvent(name: String, showOnEvent: (Int, String, Int) -> String) {
    /**
     * 处理业务逻辑
     */
    val year = 2023 //此处省略换算
    val hour = 12

    println(showOnEvent(year, name, hour))
}

//将匿名函数更改为具名函数
fun getEventStr(year: Int, name: String, hour: Int): String {
    //此处省略业务.... 直接返回值
    return "${year}年，${name}跑马拉松坚持了$hour 小时"
}

fun testName(): (String) -> String {
    //此处省略业务.... 直接返回值
    return { tips: String -> "$tips" }
}

inline fun inlineCaleValue(vararg value: Int): Int {
    var sum = 0
    for (i in value) {
        sum += i
    }
    return sum
}


class Test {
    //隐式推断匿名函数返回值类型
    val funC: () -> String = {
        val holiday = "Sunshine  Boys"
        holiday
    }

    val funC2 = {
        val holiday = "Sunshine  Boys"
        holiday
    }

    //隐式推断匿名函数返回值参数类型
    val funC3: (String, String) -> String = { name, tips ->
        val holiday = "Sunshine  Boys -> $name $tips"
        holiday
    }

    val funC4 = { name: String, tips: String ->
        val holiday = "Sunshine  Boys -> $name $tips"
        holiday
    }

}